import { render_main_page_uni_comps_apiOperate } from './cla_render_main_page_uni_comps_apiOperate';

import { render_main_page_uni_comps_eventBind } from './cla_render_main_page_uni_comps_eventBind';

import {
  spacename_render_main_page_uni_comps,
  unit_item_dom_prop_uid,
} from '../DataDefine/sourceData';
import { create_ListenEvent_mana } from '../../../../../../../global/element/Event/listenEvent_mana';
import { search_first_same_val_fromEnd_both } from '../../../../../../../global/Func/uniFunc/Func/array_func/Func/search_first_same_val_fromEnd_both';
import { packNode } from '../../../../../../../global/element/Func';

const render_main_page_uni_comps_dataManaTag =
  'render_main_page_uni_comps_dataMana';

class render_main_page_uni_comps_dataMana extends render_main_page_uni_comps_apiOperate {
  get [Symbol.toStringTag]() {
    return render_main_page_uni_comps_dataManaTag;
  }

  constructor(props) {
    super(props);
  }

  /**
   * 事件 绑定 this
   */
  eventBind = new render_main_page_uni_comps_eventBind();

  /**
   * 事件 监听管理
   */
  eventM = create_ListenEvent_mana(spacename_render_main_page_uni_comps);

  /**
   * 数据元 的 顺序
   * @type {string[]}
   */
  items_queue;

  get_uid_index(uid) {
    return this.items_queue.indexOf(uid);
  }

  /**
   * @type {{}}
   * uid 和 实际 元素 的 键值对
   */
  keyVal_uid_element = {};

  get_uid_element(uid) {
    return this.keyVal_uid_element[uid];
  }

  /**
   * 当前 已装载 的 数据源 顺序
   * @type {string[]}
   */
  cur_items_queue;

  /**
   * @func border
   */

  /**
   * 根据 数据元顺序 装载 当前数据元
   */
  mount_item_by_queue(element) {
    let nearest_item_uid = this.#get_nearest_item(element);

    this.#set_cur_item(this.get_uid(element), nearest_item_uid);
  }

  /**
   * 添加 当前数据元 到 已装载 数据元
   * @param {string} uid 当前 添加 的 数据元
   * @param {string} nearest_item_uid 离 当前数据元 数据元序列中 最近的 数据元
   */
  #set_cur_item(uid, nearest_item_uid) {
    if (nearest_item_uid == false) {
      this.cur_items_queue.unshift(uid);
    } else {
      let cur_nearest_uid_ind = this.cur_items_queue.indexOf(nearest_item_uid);

      this.cur_items_queue.splice(cur_nearest_uid_ind, 0, uid);
    }
  }

  /**
   * 获取 当前数据元 最近的 前一个结点 信息
   * @param {HTMLElement} element
   */
  #get_nearest_item(element) {
    let uid = this.get_uid(element);

    let queue_index = this.get_uid_index(uid);

    let cur_prefix_item_arr = this.items_queue.slice(0, queue_index);

    /**
     * 在 已装载元素 中 最相近 的 数序中 前面的 数据元
     * @type {string | false}
     */
    let nearest_item_uid = search_first_same_val_fromEnd_both(
      cur_prefix_item_arr,
      this.cur_items_queue
    );

    // 因为 前面 没有 锚定元素 则 将 当前元素 锚定 在 当前 最前面的 元素 前面
    if (nearest_item_uid == false) {
      packNode(this.render_border_dom, element, true, this.cur_items_queue[0]);
    }
    // 将 当前 元素 锚定 到 锚定元素 之后
    else {
      packNode(
        this.render_border_dom,
        element,
        false,
        this.get_uid_element(nearest_item_uid)
      );
    }

    return nearest_item_uid;
  }

  /**
   * @func uni_item
   */

  /**
   * 获取 元素 的 uid 信息
   * @param {HTMLElement} element
   * @returns {string}
   */
  get_uid(element) {
    return element[unit_item_dom_prop_uid];
  }
}

export { render_main_page_uni_comps_dataMana };
